﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using FrameworkLib.Facades;

namespace GestionePolveriLib.Facades
{
    [Serializable]
    public class ComposizioneColoreFacade : FacadeBase<GestionePolveriEntities>
    {
        public ComposizioneColoreFacade()
        {

        }

        public void LoadAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetAll(), callback);
        }

        public List<ComposizioneColore> GetAll()
        {
            List<ComposizioneColore> retValue = null;

            GestionePolveriEntities context = this.GetContext();
            var obj = from x in context.ComposizioneColori
                      select new ComposizioneColore
                      {
                          ID = x.IDComposizione,
                          Colore = (from y in context.AnagColori
                                    where y.IDColore == x.IDColore
                                    select new Colore
                                    {
                                        Applicazione = "",
                                        ID = y.IDColore,
                                        CodiceColore = y.CodiceColore,
                                        Descrizione = y.Descrizione,
                                        Note = y.Note,
                                        Famiglia = (from f in context.AnagFamiglie
                                                    where f.IDFamiglia == y.IDFamiglia
                                                    select new FamigliaColore
                                                    {
                                                        ID = f.IDFamiglia,
                                                        Descrizione = f.Descrizione
                                                    }).FirstOrDefault()
                                    }).FirstOrDefault(),
                          Polvere = (from z in context.AnagPolveri
                                       where z.IDPolvere == x.IDPolvere
                                       select new Polvere
                                       {
                                           ID = z.IDPolvere,
                                           CodicePolvere = z.CodicePolvere,
                                           Descrizione = z.Descrizione,
                                           Note = z.Note
                                       }).FirstOrDefault(),
                          FornitoreDesc = x.AnagPolveri.AnagFornitori.Descrizione,
                          Applicazione = x.Applicazione
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public bool Add(ComposizioneColore data)
        {
            bool retValue = false;

            try
            {
                ComposizioneColori imp = new ComposizioneColori();
                imp.IDColore = data.Colore.ID;
                imp.IDPolvere = data.Polvere.ID;
                imp.Applicazione = data.Applicazione;

                this.GetContext().ComposizioneColori.AddObject(imp);
                this.GetContext().SaveChanges();

                retValue = true;
            }
            catch (Exception ex)
            {
            }

            return retValue;
        }

        public bool Delete(ComposizioneColore data)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().ComposizioneColori
                          where x.IDComposizione == data.ID
                          select x;

                if (obj.Any())
                {
                    this.GetContext().ComposizioneColori.DeleteObject(obj.FirstOrDefault());
                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
            }

            return retValue;
        }

        public bool Modify(ComposizioneColore data)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().ComposizioneColori
                          where x.IDColore == data.ID
                          select x;

                if (obj.Any())
                {
                    ComposizioneColori imp = obj.FirstOrDefault();
                    imp.IDColore = data.Colore.ID;
                    imp.IDPolvere = data.Polvere.ID;
                    imp.Applicazione = data.Applicazione;

                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
            }

            return retValue;
        }

        public ComposizioneColore Get(int id)
        {
            ComposizioneColore retValue = null;

            GestionePolveriEntities context = this.GetContext();
            var obj = from x in context.ComposizioneColori
                      where x.IDComposizione == id
                      select new ComposizioneColore
                      {
                          ID = x.IDComposizione,
                          Colore = (from c in context.AnagColori 
                                    where c.IDColore == x.IDColore
                                    select new Colore {
                                        ID = c.IDColore,
                                        CodiceColore = c.CodiceColore
                                    }).FirstOrDefault(),
                          Applicazione = x.Applicazione
                      };

            if (obj.Any())
            {
                retValue = obj.FirstOrDefault();
            }

            return retValue;
        }

        public List<Colore> GetColoriAssociati(int polvereId)
        {
            List<Colore> retValue = null;

            try
            {
                this.Transact(() => { });

                GestionePolveriEntities context = this.GetContext();
                var obj = from x in context.ComposizioneColori
                          where x.IDPolvere == polvereId
                          select new Colore
                          {
                              ID = x.AnagColori.IDColore,
                              CodiceColore = x.AnagColori.CodiceColore
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }

            }
            catch (Exception ex)
            {
            }

            return retValue;
        }

        public List<Polvere> GetPolveriAssociate(int coloreId)
        {
            List<Polvere> retValue = null;

            try
            {
                GestionePolveriEntities context = this.GetContext();
                var obj = from x in context.ComposizioneColori
                          where x.IDColore == coloreId
                          select new Polvere
                          {
                              ID = x.AnagPolveri.IDPolvere,
                              CodicePolvere = x.AnagPolveri.CodicePolvere
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
            }

            return retValue;
        }
    }
}
